#可迭代对象
'''
我们已经知道可以对list、tuple、str等类型的数据使用for……in…
的循环语法从其中一次闹到数据进行使用，我们把这样的过程称为遍历
也叫迭代。
li = [1,2,3]
for i in li:
    print(i)
可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器
帮助我们对其进行迭代遍历使用。


'''

#六大标准数据类型：字符串、列表、元组、字典、集合、数值类型

#五大可迭代对象：字符串、列表、元组、字典、集合
#通过for…in…能够一个个遍历出元素的对象，称为可迭代对象。
li = [1,3,5,7]
for i in li:
    print(i)
print('\n')

#可迭代对象定义：
'''
1)实现了__iter__方法
2)__iter__方法返回了一个迭代器对象

'''
#可迭代对象的本质：
'''
其实都是collections(容器数据类型)模块里的Iterable类创建出来的
实例。
'''
#产看是否为可迭代对象：isinstance(对象,Iterable)
'''
from collections import Iterable  #从容器数据类型中导入Iterable类
print(isinstance([1,2],Iterable)) #True
'''
#===================在类中的函数称为方法==========================



#迭代器
'''
迭代器是访问可迭代对象的工具。
迭代器对象从集合的第一个元素开始访问，直到所有的元素被访问完。
迭代器只能往前不能后退。
'''
#迭代器的两个函数
#iter()    可取得可迭代对象的迭代器__iter__()
#next()    __next__()

#迭代器功能
'''
1.for 循环
2.逐行遍历文本文件
3.列表推导式
4.元组拆包

'''
#迭代器特性：
'''
1.访问者不需要关心迭代器内部结构，只需要不断执行next()方法；
2.不能随机访问集合中某个值，只能从头到尾顺序的读取；
3.访问过程中不能回退，不能访问之前的值；
4.适合遍历很大的数据集合，节省内存，提升速度。
5.可迭代：迭代器实现了__iter__方法，因此可以迭代
6.易耗损：迭代器经过一次依次取值的循环后就耗尽了，再次迭代需重建迭代器

'''
#迭代器的工作过程：
'''
通过iter()函数获取可迭代对象Iterable的迭代器，然后对获取到的迭
代器不断调用next()方法来获取下一个值，并将其赋值给item，当遇到
StopIteration的异常后循环结束。
'''

#for循环工作原理：
'''
1.在内部对可迭代对象调用 __iter__方法，获取到迭代器对象
2.再一次次的通过迭代器对象调用__next__方法获取迭代结果
迭代器对象.__next__()拿到下一个返回值，然后将值返回赋值给i
3.循环步骤2，直到取尽所有值，直到抛出StopIteration的异常，
for循环会捕捉到异常后结束循环。

li = [1,3,5,7]
for i in li: #迭代器对象.__next__()拿到下一个返回值，然后将值返回赋值给i
    print(i)

#for实际的内部工作原理
1)t = list1.__iter__()  #获得迭代器对象
2)i = t.__next__()
3)print(i)

'''

#迭代器Iterator
#iter()函数与next()函数
'''
list、tuple等都是可迭代对象，我们可以通过iter()函数获取这些
可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()
函数来获取下一条数据。iter()函数实际上就是调用了可迭代对象的
__iter__方法。

'''
list1 = [1,3,4,5] #list1为可迭代对象
it = iter(list1)  #将list1转换为迭代器对象it
print(it)         #打印迭代器对象地址
print(next(it))   #或者print(it.__next__())
print(next(it))
print(next(it))
print(next(it))
print('\n')

#迭代器 Iterator
#可迭代对象 Iterable









